// vite的配置
import { ConfigEnv, defineConfig, loadEnv } from 'vite'
// 解析vue插件
import vue from '@vitejs/plugin-vue'
// 环境变量和路径
import { convertEnv, getRootPath, getSrcPath } from './build/utils'
// 引入代理配置
import { createViteProxy } from './build/config'
// 扩展setup插件，支持在script标签中使用name属性
import VueSetupExtend from 'vite-plugin-vue-setup-extend'
// rollup打包分析插件
import { visualizer } from 'rollup-plugin-visualizer'
// 集成 vite-plugin-html 主要是为了对 index.html 进行压缩和注入动态数据，例如替换网站标题和cdn
import { createHtmlPlugin } from 'vite-plugin-html'
// 引入Unocss
import Unocss from 'unocss/vite'
import { presetUno, presetAttributify, presetIcons } from 'unocss'
//eslint
//import eslintPlugin from 'vite-plugin-eslint'
//引入element-plus
import AutoImport from 'unplugin-auto-import/vite'
import Components from 'unplugin-vue-components/vite'
import { ElementPlusResolver } from 'unplugin-vue-components/resolvers'
//处理图标
import Icons from 'unplugin-icons/vite'
import  IconsResolver from 'unplugin-icons/resolver'
// 处理svg
import { svgBuilder } from './src/plugins/svgBuilder'
// https://vitejs.dev/config/
// vite的配置详情
export default defineConfig((configEnv: ConfigEnv) => {
  // src路径
  const srcPath = getSrcPath()
  // 根路径
  const rootPath = getRootPath()
  // 是否是build
  // const isBuild = configEnv.command === 'build'
  // 环境变量
  const viteEnv = convertEnv(loadEnv(configEnv.mode, process.cwd()))
  // 这样就可以拿到定义好的环境变量了，也可以使用process.env.xxx这种方式进行访问
  const { VITE_PORT, VITE_PUBLIC_PATH, VITE_USE_PROXY, VITE_PROXY_TYPE } =
    viteEnv
  return {
    // 根路径
    base: VITE_PUBLIC_PATH || '/',
    // 配置路径别名
    resolve: {
      alias: {
        '~': rootPath,
        '@': srcPath,
      },
    },
    // 全局引用css样式
    css: {
      preprocessorOptions: {
        // define global scss variable
        scss: {
          additionalData: '@import \'@/styles/index.scss\';',
        },
      },
    },
    // 项目构建时间
    // define: viteDefine,
    // 服务器
    server: {
      host: '0.0.0.0', // 默认为'127.0.0.1'，如果将此设置为 `0.0.0.0` 或者 `true` 将监听所有地址，包括局域网和公网地址
      port: VITE_PORT,
      // 服务器启动时自动在浏览器中打开应用程序,当此值为字符串时，会被用作 URL 的路径名
      open: true,
      proxy: createViteProxy(VITE_USE_PROXY, VITE_PROXY_TYPE as ProxyType),
    },
    // 插件
    plugins: [
      // 解析vue插件
      vue(),
      // 扩展setup插件，支持在script标签中使用name属性
      VueSetupExtend(),
      // rollup打包分析插件
      visualizer({
        open: true,
        gzipSize: true,
        brotliSize: true,
      }),
      // 压缩html
      createHtmlPlugin({
        minify: true, // 是否压缩 html
        /**
         * 在这里写entry后，你将不需要在`index.html`内添加 script 标签，原有标签需要删除
         * @default src/main.ts
         */
        entry: 'src/main.ts',
        /**
         * 如果你想将 `index.html`存放在指定文件夹，可以修改它，否则不需要配置
         * @default index.html
         */
        template: './index.html',
        /**
         * 需要注入 index.html ejs 模版的数据
         */
        inject: {
          data: {
            title: 'index',
            injectScript: '<script src="./inject.js"></script>',
          },
        },
      }),
      // 注册unocss
      Unocss({
        // 使用Unocss
        presets: [presetUno(), presetAttributify(), presetIcons()],
      }),
      // eslint
      // eslintPlugin({
      //   include: ['src/**/*.js', 'src/**/*.vue', 'src/*.js', 'src/*.vue']
      // }),
      [svgBuilder('./src/assets/svg/')], // 这里已经将src/icons/svg/下的svg全部导入，无需再单独导入
      //按需导入
      AutoImport({
        imports: ['vue', 'vue-router'], // 自动导入vue和vue-router相关函数
        dts: 'types/auto-import.d.ts', // 生成 `auto-import.d.ts` 全局声明
        resolvers: [
          //自动导入Element plus
          ElementPlusResolver(),
          //自动导入图标
          IconsResolver({
            prefix:'Icon',
          }),
        ],
      }),
      Components({
        dts: 'types/components.d.ts',
        dirs: ['src/components'], // 按需加载的文件夹
        resolvers: [
          //自动导入element组件
          ElementPlusResolver(),
          //自动导入图标
          IconsResolver({
            enabledCollections :['ep'],
          }),
        ],
      }),
      Icons({
        autoInstall:true,
      }),
    ],
  }
})
